day03a (C++でカーネル)
code:Main.cpp
gBS->AllocatePages(AllocateAddress, EfiLoaderData,
(kernel_file_size + 0xfff) / 0x1000, &kernel_base_addr);
// (kernel_file_size + 0xfff) / 0x1000 ???
これの真意を探りたい
そもそもgBS→AllocatePagesの第3引数は何?
EDK2のドキュメントらしい
読んでもよくわからん
edk2/MdePkg/Include/Uefi/UefiSpec.h に答えがあった
IN UINTN Pages; つまり、ページ数を整数で指定するらしい
P77によると、1ページあたり4KiB(0x1000バイト)らしい
filesize + 0xfffで下位12ビットを切り上げて(例:0x3001 + 0xfff = 0x4000)、0x1000で割ればよいということです
ExitBootServicesがいつまでたっても動かない
原因はこれを読んだ後にPrintを使っていたのがあった(PrintはBootServiceだから、Exitしたら使えなくなってしまう)